搜索 K
Appearance
博客正在加载中...
Appearance
讲解下 Nginx 内部的原理
启动 Nginx 进程后,我们发现 Nginx 其实是有 2 个进程的:
# ps -ef | grep nginx
root 14858 1 0 07:35 ? 00:00:00 nginx: master process ./nginx
nobody 14860 14858 0 07:35 ? 00:00:00 nginx: worker process 一个是 master 进程,一个是 worker 进程。Nginx 是这样工作的:
示意图:
首先,一个请求来到了 Nginx,那么 master 就要开始工作了:
为什么 Nginx 要这样设计呢?因为这样有很多好处,例如:
Nginx 同 redis 类似都采用了 IO 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。
每个 worker 的线程可以把一个 cpu 的性能发挥到极致,所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
注意,在 Windows 下的话则没有 IO 多路复用机制,所以在 Windows 下,Nginx 的性能会降低不少(Redis 同理,最好安装到 Linux 下使用) Nginx 默认没有开启利用多核 cpu,我们可以通过设置 worker 数量和设置 worker_cpu_affinity 配置参数来充分利用多核 cpu 的性能。配置实例:
2 核 CPU,开启 2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;这个值是设置每个 worker 进程所能建立连接的最大值。
worker_connections 1024 举个例子,一个请求发送过来,那么这个请求到 worker 进程之间有一个连接,并且 worker 到请求之间也有一个连接;
而如果这个请求涉及到转发给 Tomcat 处理,那么还得占用 2 个连接:worker 进程到 Tomcat 之间占用一个,Tomcat 进程到 worker 进程占用一个
┌─────────┐ ┌─────────┐ ┌─────────┐
│ │ ←─────── │ │ ─────→ │ │
│ Client │ │ Worker │ │ Tomcat │
│ │ │ │ │ │
│ │ ──────→ │ │ ←───── │ │
└─────────┘ └─────────┘ └─────────┘ 综上,Nginx 支持的最大并发数是多少得分类讨论:
通过前面的讲解,其实基本上够我们使用了,但有些时候学多一点,使用起来更得心应手,后续我们会介绍一些 Nginx 常用的配置,读者可以看情况阅读。